/**
 * @(#)com.hq.sys.initializer.AbstractInitializer.java
 * 版权声明 厦门亿力吉奥信息科技有限公司, 版权所有 违者必究
 *
 *<br> Copyright:： Copyright (c) 2012
 *<br> Company： 厦门亿力吉奥信息科技有限公司
 *<br> Author： 陈谋坤(chmk35@163.com)
 *<br> Date：Sep 12, 2012
 *<br> Version：1.0
 *————————————————————————————————————
 *修改记录
 *    修改者：
 *    修改时间：
 *    修改原因：
 *—————————————————————————————————————
 */

package com.hq.common.initializer;


import com.hq.common.utils.Orderable;
import org.quartz.SchedulerException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * 系统初始化类适配器
 *
 * @author 陈谋坤 (chmk35@163.com)
 * @version Revision: 1.00 Date：Sep 12, 2012
 */
public abstract class AbstractInitializer implements Initializer, Orderable {
    private final Logger logger = LoggerFactory.getLogger(this.getClass());

    /**
     * 标识是否已经初始化
     */
    protected volatile boolean initialized = false;

    /**
     * 需要子类实现的初始化操作
     */
    public abstract void init() throws SchedulerException;

    /**
     * 执行初始化操作
     */
    public void initialize() {
        if (isInitialized()) {
            return;
        }
        String desc = getDesc();  //获取初始化器描述
        try {
            init();   //执行初始化操作
            initialized = true;    //设置初始化标识
        } catch (Exception e) {
            logger.info("初始化[" + desc + "]发生异常", e);
        }
    }

    /**
     * 判断是否已经初始化
     */
    public boolean isInitialized() {
        return initialized;
    }

    /**
     * 排序号，越小越在前面。当初始化器需要优先加载(存在依赖)的时候，就需要重写该方法
     *
     * @return 默认返回1000
     */
    public int getOrderNo() {
        return Orderable.HIGHEST_PRECEDENCE + 1000;
    }
}
